package com.xjm.bean.postprocessor;

import com.xjm.model.Root;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.*;
import org.springframework.context.annotation.Configuration;

/**
 * @author jaymin
 * 2021/1/7 23:10
 */
@Configuration
public class MyBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

	}

	/**
	 * 标准初始化后，修改应用程序上下文的内部BeanDefiniton注册表。<br>
	 * 所有常规bean定义都将被加载，但尚未实例化任何bean。 <br>
	 * 这允许在下一个后处理阶段开始之前添加更多的BeanDeinition。 <br>
	 * Spring工厂级别的BeanFactoryPostProcessor,优先级别高于常规的BeanFactoryPostProcessor.<br>
	 * 第三方框架整合时，可以实现这个注册接口进行BeanDefinition注册.如Mybatis.<br>
	 * 设计模式:责任链模式<br>
	 * @param registry the bean definition registry used by the application context
	 * @throws BeansException
	 */
	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
		BeanDefinition beanDefinition = getBeanDefinition(Root.class);
		registry.registerBeanDefinition("root",beanDefinition);
		System.out.println("Customer BeanPostProcessors execute.");
	}

	private BeanDefinition getBeanDefinition(Class<?> clazz){
		AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(clazz).getBeanDefinition();
		return beanDefinition;
	}
}
